package com.cskaoyan.javase.oop1._13block._2static;

/**
 * 定义
 * 什么是静态代码块？
 * 定义在类的成员位置，使用以下声明方式声明的代码块，称之为静态代码块
 * //成员位置
 * static{
 *   // 局部位置
 * }
 * //成员位置
 * 静态代码块在类中的作用
 * 随着类加载的过程而执行
 * 静态代码块可以看成是一个在类加载过程中，会自动调用的静态方法！用于给静态成员变量赋值！
 *
 * 总结一下目前在类加载过程中,给静态成员变量赋值的方式:
 *      1.默认初始化,具有默认值
 *      2.显式赋值
 *      3,静态代码块赋值
 * 以上赋值,默认初始化永远最先进行,显式赋值和静态代码块赋值按照代码书写顺序从上到下执行.
 * 静态代码块执行的原理: 和类加载的机制有关,它的执行顺序是类加载的机制保证的
 *      类加载过程中,JVM会执行一个类加载过程中会执行的代码封装成的一个方法
 *      这个方法会按照代码顺序从上到下执行静态代码块和静态成员变量的显式赋值
 *
 * 静态代码块的实践用处:
 *      1.复杂的静态成员变量赋值,比如静态成员变量的赋值需要执行一个方法,需要一个算法等等
 *      2.如果有一段代码，在类的全局，从始至终，只运行一次，可以写到静态代码块中。（依赖于类加载只有一次的原理）
 *
 * @since 09:45
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        System.out.println(Student.grade);
    }
}

class Student {

    static String grade = "小学六年级";
    // 静态代码块
    static {
        grade = "初中七年级";
    }

}